package com.company.class1;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestClass {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException {

        // 普通方式
        Person p = new Person();
        p.setName("张三");
        /*p.setAge(18);*/
        p.work();

        /*通过反射方式*/
        // 1. 得到类对象
        Class c = Class.forName("com.company.class1.Person");
        /*方式1
        Class c = Class.forName("com.company._1class.Person");
        方式2
        Class c2 = p.getClass();
        方式3
        Class c3 = Person.class;*/
        // 2. 通过类对象创建该类的对象
        Person p2 =(Person)c.newInstance();//.getDeclaredConstructor().newInstance();
        // 3. 用反射的方式操作属性，反射方式操作的属性不管是不是私有变量都可以
        Field f = c.getDeclaredField("age");
        //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查
        f.setAccessible(true);
        //给对象赋值
        f.set(p2,20);
        //再次赋值
        Field f2 = c.getDeclaredField("name");
        f2.setAccessible(true);
        f2.set(p2,"李四");
        // 4. 用反射的方式调用方法
        Method m = c.getDeclaredMethod("work",new Class[]{});
        m.invoke(p2);

    }
}
